package com.qr.read;

import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.binary.XSSFBUtils;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.joda.time.DateTime;
import sun.rmi.runtime.Log;

import java.io.FileInputStream;
import java.util.Date;

/**
 * 读取表中不同类型的值
 * 因为读取表，表中更多的不同类型的组合
 *      首先标题一般会是字符串类型，会放在第一行，用来描述我们表中的各个列存放的内容说明
 */
public class ReadType {

    public static void main(String[] args) throws Exception{

        String path = "E:\\workspace\\GitRepository\\java-framework\\poi\\poi-use\\src\\main\\resources\\";

        //获取文件流
        FileInputStream fileInputStream = new FileInputStream(path+"ai.xlsx");

        Workbook sheets = new XSSFWorkbook(fileInputStream);

        //获取标题内容
        Sheet sheetAt = sheets.getSheetAt(0);
        //第一行
        Row title = sheetAt.getRow(0);
        //行不为空
        if (title!=null){
            //读取行中的每一列
            //这一行中的数量,就是这一行中有多少列
            int cells = title.getPhysicalNumberOfCells();
            //循环读取每一个列
            for (int i = 0; i < cells; i++) {
                Cell cell = title.getCell(i);
                //取出数据
                if (cell!=null){
                    //可以获得类型
                    CellType cellType = cell.getCellType();
                    String stringCellValue = cell.getStringCellValue();
                    System.out.println(stringCellValue);
                }
            }
            System.out.println();
        }

        /**
         * 获取表中的内容
         */
        //获取表中所有的行，可以统计表中行数
        int rows = sheetAt.getPhysicalNumberOfRows();
        //这是第二行数据的开始，第一行是标题
        for (int j = 1; j < rows; j++) {
            Row rowDate = sheetAt.getRow(j);
            if (rowDate!=null){
                //读取列
                int cells = title.getPhysicalNumberOfCells();
                //每一行中所有的数据
                for (int i = 0; i < cells; i++) {
                    System.out.println(i);
                    //拿到这一列
                    Cell cell = rowDate.getCell(i);
                    //在获取数据的时候，我们不知道列的类型，需要匹配
                    if (cell!=null){
                        CellType cellType = cell.getCellType();
                        String cellValue = "";
                        //类型的判断
                        switch (cellType){
                            case STRING:  //字符串
                                cellValue = cell.getStringCellValue();
                                break;
                            case BOOLEAN:  //布尔
                                cellValue = String.valueOf(cell.getBooleanCellValue());
                                break;
                            case BLANK:  //空
                                cellValue+="/";
                                break;
                            case NUMERIC:  //数字（存在日期和普通数字）
                                //判断当前列是否是一个日期
                                if (HSSFDateUtil.isCellDateFormatted(cell)){
                                    //转换成日期对应的格式
                                    Date dateCellValue = cell.getDateCellValue();
                                    cellValue = new DateTime(dateCellValue).toString("yyyy-MM-dd");
                                }else {
                                    //普通数字,设置类型
                                    cell.setCellType(CellType.STRING);
                                    cellValue  = cell.toString();
                                }
                                break;
                            case ERROR:  //错误
                                System.out.println("类型错误");
                                break;
                        }
                        System.out.println(cellValue);
                    }
                }

            }
        }
        fileInputStream.close();
    }
}
